// src/hooks/useSocketInteractions.js
import { inject, ref } from 'vue'
import { useUserStore } from '@/store/modules/user/user.js'
import {  } from 'element-plus' // 假设用Element Plus的提示组件（可替换为alert）

export function useSocketInteractions() {
  // 1. 统一注入依赖（组件无需重复注入）
  const socket = inject('socket')
  const userStore = useUserStore()
  const isLoading = ref(false) // 全局加载状态（可选，控制按钮loading）

  // 通用错误处理
  const handleError = (msg = '操作失败，请稍后重试') => {
    ElMessage.error(msg)
    isLoading.value = false
  }

  // 2. 发送点赞
  const sendLike = async ({ toUserId }) => {
    try {
      isLoading.value = true

      // 通用校验：登录状态
      if (!userStore.isLogin) {
        handleError('请先登录！')
        return
      }

      // 个性化校验：必填参数
      if (!toUserId) {
        handleError('缺少被点赞用户ID！')
        return
      }

      // 发送Socket事件（事件名需和服务端一致）
      await new Promise((resolve, reject) => {
        socket.emit(
          'sendTriggerLike', // 服务端监听的点赞事件名
          { toUserId }, // 传递给服务端的参数
          (res) => { // 服务端响应回调（需服务端支持返回结果）
            if (res?.success) resolve(res)
            else reject(res?.message || '点赞失败')
          }
        )
      })

      // 成功提示
      ElMessage.success('点赞成功！')
    } catch (err) {
      handleError(err.message)
    } finally {
      isLoading.value = false
    }
  }

  // 3. 发送关注
  const sendFollow = async ({ toUserId }) => {
    try {
      isLoading.value = true

      // 通用校验：登录状态
      if (!userStore.isLogin) {
        handleError('请先登录！')
        return
      }

      // 个性化校验：必填参数 + 避免自关注
      if (!toUserId) {
        handleError('缺少被关注用户ID！')
        return
      }
      if (userStore.userInfo?.userId === toUserId) {
        handleError('不能关注自己哦！')
        return
      }

      // 发送Socket事件（事件名需和服务端一致）
      await new Promise((resolve, reject) => {
        socket.emit(
          'sendTriggerFollow', // 服务端监听的关注事件名
          { toUserId }, // 传递给服务端的参数
          (res) => {
            if (res?.success) resolve(res)
            else reject(res?.message || '关注失败')
          }
        )
      })

      ElMessage.success('关注成功！')
    } catch (err) {
      handleError(err.message)
    } finally {
      isLoading.value = false
    }
  }

  // 4. 发送评论（支持普通评论和回复评论）
  const sendComment = async ({ toVideoId, commentContent, replyId = '' }) => {
    try {
      isLoading.value = true

      // 通用校验：登录状态
      if (!userStore.isLogin) {
        handleError('请先登录！')
        return
      }

      // 个性化校验：必填参数
      if (!toVideoId) {
        handleError('缺少视频ID！')
        return
      }
      if (!commentContent.trim()) {
        handleError('评论内容不能为空！')
        return
      }

      // 发送Socket事件（事件名需和服务端一致）
      await new Promise((resolve, reject) => {
        socket.emit(
          'sendComment', // 服务端监听的评论事件名
          {
            toVideoId, // 目标视频ID
            replyId, // 被回复的评论ID（非回复场景为空）
            content: commentContent.trim(), // 评论内容
            userId: userStore.userInfo.userId, // 评论者ID（当前登录用户）
            userNickname: userStore.userInfo.userNickname // 可选：服务端也可查数据库
          },
          (res) => {
            if (res?.success) resolve(res)
            else reject(res?.message || '评论发送失败')
          }
        )
      })

      ElMessage.success('评论发送成功！')
    } catch (err) {
      handleError(err.message)
    } finally {
      isLoading.value = false
    }
  }

  // 暴露给组件使用的方法和状态
  return {
    isLoading,
    sendLike,
    sendFollow,
    sendComment
  }
}